home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / COMMS / C100.ZIP / KERMIT.ZIP / CKICON.C < prev    next >
Text File  |  1990-01-31  |  7KB  |  268 lines

  1. char *connv = "Connect Command for Amiga, V4D(002) 27 July 86";
  2.  
  3. /*  C K I C O N  --  Dumb terminal connection to remote system, for Amiga  */
  4. /*
  5.  Author: Frank da Cruz (SY.FDC@CU20B),
  6.  Columbia University Center for Computing Activities, January 1985.
  7.  Copyright (C) 1985, Trustees of Columbia University in the City of New York.
  8.  Permission is granted to any individual or institution to use, copy, or
  9.  redistribute this software so long as it is not sold for profit, provided this
  10.  copyright notice is retained.
  11.  
  12.  Modified for Amiga by Jack J. Rouse, The Software Distillery
  13.  
  14.  Uses the following special functions from ckitio:
  15.     conttb() -- Prepares for connect mode.
  16.     contte() -- Terminates connect mode.  If any active write does
  17.         terminate in 1 second, it is aborted and the serial
  18.         device restarted to break XOFF deadlocks.
  19.     ttocq(c) -- Outputs character to serial device.  If it can not
  20.         be sent immediately, it is queued (as when XOFF'ed).
  21.         If the queue (currently 64 characters) overflows, it
  22.         returns an error.
  23.     contti() -- Waits for console or serial input, returning console
  24.         character, or -2 if serial input is available first.
  25.         It sends queued serial output when the serial device
  26.         is ready for it.
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <ctype.h>            /* Character types */
  31. #include "ckcdeb.h"
  32. #include "ckcker.h"
  33.  
  34. extern int local, speed, escape, duplex, parity, flow, seslog, mdmtyp;
  35. extern int errno;
  36. extern char ttname[], sesfil[];
  37. extern CHAR dopar();
  38.  
  39. /* Variables global to this module */
  40. extern char *chstr();
  41. static int active;
  42. static int logging;            /* session logging active */
  43.  
  44. #define LBUFL 200            /* Line buffer */
  45. char lbuf[LBUFL];
  46.  
  47. /*  C O N E C T  --  Perform terminal connection  */
  48.  
  49. conect() {
  50.     int c, n, i;
  51.     int seenescape;
  52.     int overrun;
  53.  
  54.     if (!local) {
  55.     printf("Sorry, you must 'set line' first\n");
  56.     return(-2);
  57.     }
  58.     if (speed < 0) {
  59.     printf("Sorry, you must 'set speed' first\n");
  60.     return(-2);
  61.     }
  62.     if (escape < 0 || escape > 0177) {
  63.     printf("Your escape character is not ASCII - %d\n",escape);
  64.     return(-2);
  65.     }
  66.     if (ttopen(ttname,&local,mdmtyp) < 0) {
  67.     printf("Sorry, can't open %s\n",ttname);
  68.     return(-2);
  69.     }
  70.     printf("Connecting thru %s, speed %d.\r\n",ttname,speed);
  71.     printf("The escape character is %s (%d).\r\n",chstr(escape),escape);
  72.     printf("Type the escape character followed by C to get back,\r\n");
  73.     printf("or followed by ? to see other options.\r\n");
  74.     if (seslog) printf("(Session logged to %s.)\r\n",sesfil);
  75.  
  76.     /* Condition console terminal and communication line */
  77.  
  78.     if (conbin(escape) < 0) {
  79.     printf("Sorry, can't condition console terminal\n");
  80.     return(-2);
  81.     }
  82.     if (ttvt(speed,flow) < 0) {
  83.     conres();
  84.     printf("Sorry, Can't condition communication line\n");
  85.     return(-2);
  86.     }
  87.  
  88.     connoi();            /* disable interrupts so we can use ^C, ^D */
  89.     conttb();            /* prepare contti interface */
  90.     active = logging = 1;
  91.     seenescape = overrun = 0;
  92.     while (active) {
  93.     if ((c = contti()) >= 0) {
  94.         if (seenescape) {
  95.         doesc(c);
  96.         seenescape = 0;
  97.         }
  98.         else if (c == escape)
  99.         seenescape = 1;
  100.         else if ((i = ttocq(dopar(c))) >= 0) { /* Ordinary character */
  101.         overrun = 0;
  102.         if (duplex)
  103.         {   /* Half duplex? */
  104.             conoc(c);    /* Yes, also echo it. */
  105.             if (seslog && logging)     /* And maybe log it. */
  106.             if (zchout(ZSFILE,c) < 0)
  107.                 seslog = 0;
  108.         }
  109.         }
  110.         else if (i == -2) { /* overrun */
  111.         if (!overrun) conoc(BEL);
  112.         overrun = 1;
  113.         }
  114.         else {
  115.         printf("Can't send character\n");
  116.         active = 0;
  117.         }
  118.     }
  119.     else if (c != -2)
  120.     {
  121.         printf("Can't get character\n");
  122.         break;
  123.     }
  124.     if (!active) break;
  125.     n = ttchk();
  126.     if (n > LBUFL)
  127.         n = LBUFL;
  128.     else if (n < 0) {
  129.         printf("Can't get character\n");
  130.         active = 0;
  131.     }
  132.     if (n > 0 && (n = ttxin(n, lbuf)) > 0) {
  133.         for (i = 0; i < n; ++i) lbuf[i] &= 0177;    /* Strip */
  134.         conxo(n, lbuf);
  135.         if (seslog) zsoutx(ZSFILE,lbuf,n);        /* Log */
  136.     }
  137.     }
  138.  
  139.     contte();            /* clean up contti stuff */
  140.     conres();            /* Reset the console. */
  141.     /* reset funny modes and print reassuring message */
  142.     printf("\017\23320h[Back at Local System]\n");
  143.     return(0);
  144. }
  145.  
  146. /*  H C O N N E  --  Give help message for connect.  */
  147.  
  148. hconne() {
  149.     int c;
  150.     static char *hlpmsg[] = {"\
  151. \r\nC to close the connection, or:",
  152. "\r\n  0 (zero) to send a null",
  153. "\r\n  B to send a BREAK",
  154. "\r\n  H to hangup and close connection",
  155. "\r\n  Q to suspend logging",
  156. "\r\n  R to resume logging",
  157. "\r\n  S for status",
  158. "\r\n  ? for help",
  159. "\r\n escape character twice to send the escape character.\r\n\r\n",
  160. "" };
  161.  
  162.     conola(hlpmsg);            /* Print the help message. */
  163.     conol("Command>");            /* Prompt for command. */
  164.     while ((c = contti()) < 0);        /* wait for char, ignoring errors */
  165.     conoc(c);                /* Echo it. */
  166.     conoll("");
  167.     c &= 0177;                /* Strip any parity. */
  168.     return(c);                /* Return it. */
  169. }
  170.  
  171.  
  172. /*  C H S T R  --  Make a printable string out of a character  */
  173.  
  174. char *
  175. chstr(c) int c; {
  176.     static char s[8];
  177.     char *cp = s;
  178.  
  179.     if (c < SP) {
  180.     sprintf(cp,"CTRL-%c",ctl(c));
  181.     } else sprintf(cp,"'%c'\n",c);
  182.     cp = s;
  183.     return(cp);
  184. }
  185.  
  186. /*  D O E S C  --  Process an escape character argument  */
  187.  
  188. doesc(c) char c; {
  189.     CHAR d;
  190.     char temp[50];
  191.     int n;
  192.  
  193.     c &= 0177;
  194.     while (1) {
  195.     if (c == escape) {        /* Send escape character */
  196.         d = dopar(c); ttocq(d); return;
  197.         } else                /* Or else look it up below. */
  198.         if (isupper(c)) c = tolower(c);
  199.  
  200.     switch (c) {
  201.  
  202.     case 'c':            /* Close connection */
  203.     case '\03':
  204.         active = 0; conol("\r\n"); return;
  205.  
  206.     case 'b':            /* Send a BREAK signal */
  207.     case '\02':
  208.         ttsndb(); return;
  209.  
  210.     case 'h':            /* Hangup */
  211.     case '\010':
  212.         tthang(); active = 0; conol("\r\n"); return;
  213.  
  214.     case 'q':
  215.     case '\021':
  216.         if (logging && seslog) conoll("(Logging suspended)");
  217.         logging = 0;
  218.         return;
  219.  
  220.     case 'r':
  221.     case '\022':
  222.         if (!logging && seslog) conoll("(Logging resumed)");
  223.         logging = 1;
  224.         return;
  225.  
  226.     case 's':            /* Status */
  227.     case '\023':
  228.         conol("\r\nConnected thru ");
  229.         conol(ttname);
  230.         if (speed >= 0) {
  231.         sprintf(temp,", speed %d",speed); conol(temp);
  232.         }
  233.         if (parity) {
  234.         conol(", ");
  235.         switch (parity) {
  236.             case 'e': conol("even");  break;
  237.             case 'o': conol("odd");   break;
  238.             case 's': conol("space"); break;
  239.             case 'm': conol("mark");  break;
  240.         }
  241.         conol(" parity");
  242.         }
  243.         if (seslog) {
  244.         conol(", logging to "); conol(sesfil);
  245.         if (!logging) conol(" (suspended)");
  246.             }
  247.         if ((n = ttonq()) > 0) {
  248.         sprintf(temp, ", %d output chars queued", n);
  249.         conol(temp);
  250.         }
  251.         conoll(""); return;
  252.  
  253.     case '?':            /* Help */
  254.         c = hconne(); continue;
  255.  
  256.     case '0':            /* Send a null */
  257.         c = '\0'; d = dopar(c); ttocq(d); return;
  258.  
  259.     case SP:            /* Space, ignore */
  260.         return;
  261.  
  262.     default:            /* Other */
  263.         conoc(BEL); return;     /* Invalid esc arg, beep */
  264.         }
  265.     }
  266. }
  267.  
  268.